<?php

namespace App\Http\Controllers\Car;

use App\Models\CarModels\CarAccidentRecord;
use App\Models\CarModels\CarFuelRecord;
use App\Models\CarModels\CarInsuranceRecordBillFile;
use App\Models\CarModels\CarMaintence;
use App\Models\CarModels\CarMaintenceFile;
use App\Models\SystemManagement\Employee;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
use Validator;
/**
 * @group 设备管理->任务管理->保养记录
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */
class CarMaintenceRecordController extends Controller
{


    /**
     * @queryParam project  保养项目
     * @queryParam next_project  下次保养项目
     * @queryParam department 保养单位
     * @queryParam current_mileage 当前里程数
     * @queryParam previous_mileage 上次里程数
     * @queryParam bill 保养金额
     * @queryParam next_mileage 下次里程数
     * @queryParam maintenance_date 保养日期
     * @queryParam previous_maintenance_date 上次保养日期
     * @queryParam next_maintenance_date 下次保养日期
     * @queryParam desc 备注
     * @queryParam car_id 所属车辆id
     * @queryParam staff_id 执行人id
     *
     * @bodyParam search string optional 地址信息（模糊）暂定 原型图不清楚
     * @bodyParam user int optional 筛选负责人信息 暂定 原型图不清楚
     *
     * @bodyParam search string optional 车牌号
     * @bodyParam kind int optional 车型
     */
    public function index(Request $request){

        $query= CarMaintence::with('car')->whereHas('car',function ($q) use ($request){
            $request->has('search') && $q->where('plates_number','like',"%{$request->get('search')}%");
            $request->has('kind') && $q->where('kinds_id',$request->get('kind'));
        });
        return response()->json(encodeMsg($query->paginate(),200),200);

    }

    /**
     *
     * @bodyParam project string required 保养项目
     * @bodyParam department string required 保养单位
     * @bodyParam next_project string optional 下次保养项目
     * @bodyParam current_mileage float required 当前里程数
     * @bodyParam previous_mileage float required 上次里程数
     * @bodyParam bill float required 保养金额
     * @bodyParam next_mileage float required 保养日期
     * @bodyParam maintenance_date datetime required 上次保养日期
     * @bodyParam desc string optional 备注
     * @bodyParam car_id int required 所属车辆id 外键 车辆信息
     * @bodyParam staff_id int optional 执行人id 外键 执行人
     * @bodyParam staff string optional 执行人
     * @bodyParam files string optional 保养图片 1，2，3，4
     *
     * @queryParam project  保养项目
     * @queryParam next_project  下次保养项目
     * @queryParam department 保养单位
     * @queryParam current_mileage 当前里程数
     * @queryParam previous_mileage 上次里程数
     * @queryParam bill 保养金额
     * @queryParam next_mileage 下次里程数
     * @queryParam maintenance_date 保养日期
     * @queryParam previous_maintenance_date 上次保养日期
     * @queryParam next_maintenance_date 下次保养日期
     * @queryParam desc 备注
     * @queryParam car_id 所属车辆id
     * @queryParam staff_id 执行人id
     *
     */
    public function store(Request $request){

        $e = genValidate();
        $validator = Validator::make($request->all(),$e);
        if($validator->fails()){
            return response()->json(encodeMsg($validator->errors()->messages(),400),400);
        }
        $data=$request->all();
        DB::beginTransaction();
        try{
            if ($request->has('staff')){
                unset($data['staff']);
                    $staff=Employee::where('name',$request->get('staff'))->first();
                    if ($staff==null){
                        return response()->json(encodeMsg(["message"=>"没有对应执行人姓名"],500),500);
                    }
                    $data['staff_id']=$staff['id'];
            }
            $data=CarMaintence::create($data);
            if($request->has('files')){
                $file_data = [];
                $fileArr = explode(',',$request->get('files'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['record_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarMaintenceFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复"],404), 404);
                }
            }
            DB::commit();
            return response()->json(encodeMsg($data,201),201);
        }catch (QueryException $e){
            DB::rollBack();
            return response()->json(encodeMsg(["message"=>"数据添加出错"],400),400);
        }
    }

    /**
     *
     * @queryParam project  保养项目
     * @queryParam next_project  下次保养项目
     * @queryParam department 保养单位
     * @queryParam current_mileage 当前里程数
     * @queryParam previous_mileage 上次里程数
     * @queryParam bill 保养金额
     * @queryParam next_mileage 下次里程数
     * @queryParam maintenance_date 保养日期
     * @queryParam previous_maintenance_date 上次保养日期
     * @queryParam next_maintenance_date 下次保养日期
     * @queryParam desc 备注
     * @queryParam car_id 所属车辆id
     * @queryParam staff_id 执行人id
     * @queryParam images 图片
     *
     */
    public function show($pk){
        $data = CarMaintence::with('car')->with('staff')->with('images')->find($pk);
        if($data == []){
            return response()->json(encodeMsg(["message"=>"没有该记录"],404),404);
        }else{
            return response()->json(encodeMsg($data,200),200);
        }
    }

    /**
     *
     * @bodyParam project string optional 保养项目
     * @bodyParam next_project string optional 下次保养项目
     * @bodyParam department string optional 保养单位 外键 部门
     * @bodyParam current_mileage float optional 当前里程数
     * @bodyParam previous_mileage float optional 上次里程数
     * @bodyParam bill float optional 保养金额
     * @bodyParam next_mileage float optional 保养日期
     * @bodyParam maintenance_date datetime optional 上次保养日期
     * @bodyParam desc string optional 备注
     * @bodyParam car_id int optional 所属车辆id 外键 车辆信息
     * @bodyParam staff_id int optional 执行人id 外键 执行人
     * @bodyParam files string optional 保养图片 1，2，3，4
     *
     * @queryParam project  保养项目
     * @queryParam next_project  下次保养项目
     * @queryParam department 保养单位
     * @queryParam current_mileage 当前里程数
     * @queryParam previous_mileage 上次里程数
     * @queryParam bill 保养金额
     * @queryParam next_mileage 下次里程数
     * @queryParam maintenance_date 保养日期
     * @queryParam previous_maintenance_date 上次保养日期
     * @queryParam next_maintenance_date 下次保养日期
     * @queryParam desc 备注
     * @queryParam car_id 所属车辆id
     * @queryParam staff_id 执行人id
     */
    public function update(Request $request, $pk){

        $e = genValidate();
        $validator = Validator::make($request->all(),$e);
        if($validator->fails()){
            return response()->json(encodeMsg($validator->errors()->messages(),400),400);
        }

        $data = CarMaintence::find($pk);
        if($data == []){
            return response()->json(["message"=>"没有该记录"],404);
        }
        DB::beginTransaction();
        try {
            if($request->has('files')){
                $origin_files = CarMaintenceFile::where('record_id',$data->id)->get()->toArray();//图片原来的id号是好多 取出来

                $origin_file_ids = array();//这个数组用于报错以前的所有file的id号
                if($origin_files != []){
                    foreach ($origin_files as $v){
                        array_push($origin_file_ids,$v['id']);
                    }
                }
                $file_data = [];
                $fileArr = explode(',',$request->get('files'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['record_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    CarMaintenceFile::whereIn('id',$origin_file_ids)->delete();
                    CarMaintenceFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复"],404), 404);
                }
            }
            $data->update($request->all());
            DB::commit();
            return response()->json(encodeMsg($data,200), 200);
        }catch (QueryException $e){
            DB::rollBack();
            return response()->json(encodeMsg(["message"=>"修改时出错".$e->getMessage()],500),500);
        }
    }

    /**
     */

    public function destroy($pk){
        $data = CarMaintence::find($pk);
        if($data == []){
            return response()->json(encodeMsg(["message"=>"没有该事故记录"],404),404);
        }
        $data->delete();
        return response()->json(encodeMsg(["message"=>"删除成功"],204),200);
    }
}
